package com.zoz.utils;
import java.io.BufferedInputStream;  
import java.io.File;  
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.CRC32;  
import java.util.zip.CheckedOutputStream;  
import java.util.zip.ZipEntry;  
import java.util.zip.ZipOutputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;  
  
public class ZipCompressorUtil {     
    static final int BUFFER = 8192;    
    private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);
       
//    public static void compress(String... pathName,String zipFile) {   
//        ZipOutputStream out = null;     
//        try {    
//            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);     
//            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,     
//                    new CRC32());     
//            out = new ZipOutputStream(cos);     
//            String basedir = "";   
//            for (int i=0;i<pathName.length;i++){  
//                compress(new File(pathName[i]), out, basedir);     
//            }  
//            out.close();    
//        } catch (Exception e) {     
//            throw new RuntimeException(e);     
//        }   
//    }     
    public static void compress(String srcPathName,String zipFile) throws Exception {     
        File file = new File(srcPathName);     
        if (!file.exists())  {
        	throw new RuntimeException(srcPathName + "不存在！");     
        }
        try(FileOutputStream fileOutputStream = new FileOutputStream(zipFile);     
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());) {     
            ZipOutputStream out = new ZipOutputStream(cos);     
            String basedir = "";     
            compress(file, out, basedir);     
        }   
    }     
    
    private static void compress(File file, ZipOutputStream out, String basedir) {     
        /* 判断是目录还是文件 */    
        if (file.isDirectory()) {     
        	logger.warn("压缩：{}" , basedir + file.getName());     
            compressDirectory(file, out, basedir);     
        } else {     
        	logger.warn("压缩：{}" , basedir + file.getName());     
            compressFile(file, out, basedir);     
        }     
    }     
    
    /** 压缩一个目录 */    
    private static void compressDirectory(File dir, ZipOutputStream out, String basedir) {     
        if (!dir.exists())     
            return;     
    
        File[] files = dir.listFiles();     
        for (int i = 0; i < files.length; i++) {     
            /* 递归 */    
            compress(files[i], out, basedir + dir.getName() + "/");     
        }     
    }     
    
    /** 压缩一个文件 */    
    private static void compressFile(File file, ZipOutputStream out, String basedir) {     
        if (!file.exists()) {     
            return;     
        }     
        try (BufferedInputStream bis = new BufferedInputStream(     
                new FileInputStream(file)); ){     
                
            ZipEntry entry = new ZipEntry(basedir + file.getName());     
            out.putNextEntry(entry);     
            int count;     
            byte[]  data = new byte[BUFFER];     
            while ((count = bis.read(data, 0, BUFFER)) != -1) {     
                out.write(data, 0, count);     
            }     
        } catch (Exception e) {     
        	logger.error(" 压缩一个文件失败",e);
        }     
    }      
}   